package cn.bugstack.mybatis.executor;


import cn.bugstack.mybatis.executor.statement.StatementHandler;
import cn.bugstack.mybatis.mapping.BoundSql;
import cn.bugstack.mybatis.mapping.MappedStatement;
import cn.bugstack.mybatis.session.Configuration;
import cn.bugstack.mybatis.session.ResultHandler;
import cn.bugstack.mybatis.transaction.Transaction;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;


public class SimpleExecutor extends BaseExecutor {


    // 事务是外部传入的
    public SimpleExecutor(Configuration configuration, Transaction transaction) {
        super(configuration, transaction);
    }


    // 模版模式-子类实现模版具体的方法
    @Override
    protected <E> List<E> doQuery(MappedStatement ms, Object parameter, ResultHandler resultHandler, BoundSql boundSql) {

        try {
            // todo ms 也要关联配置类？
            Configuration configuration = ms.getConfiguration();
            // todo 为啥要通过配置类获取 处理类？
            StatementHandler handler = configuration.newStatementHandler(this, ms, parameter, resultHandler, boundSql);

            // todo 为啥要通过事务获取连接？
            Connection connection = transaction.getConnection();

            // todo  处理器准备 需要关联连接信息
            Statement stmt = handler.prepare(connection);
            // todo  处理器参数化语句 这个逻辑上说的通
            handler.parameterize(stmt);
            // 处理器器 代理查询逻辑
            return handler.query(stmt, resultHandler);
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }

    }





}
